clear all;
matlabpool(12);
%Setting Options

optionsLoose = optimset('TolX', 1e-5, 'TolFun',1e-5, 'MaxFunEvals', 1e5, 'MaxIter', 1e5);
optionsTight = optimset('TolX', 1e-8, 'TolFun',1e-8, 'MaxFunEvals', 1e8, 'MaxIter', 1e8);

UtilFuncParam = 1;
ChoiceProbForm = 1;
NumBootReps = 250;
RandomizationSeed = 12345;
%%
%Loading Data
DATA = csvread('CCES_Matlab_Senate_Round.csv', 1, 0);

%%

VoteDem = DATA(:,1);
VoterIdeal = DATA(:,2);
RepPartyIdeal = DATA(:,3);
DemPartyIdeal = DATA(:,4);
RepCandIdeal = DATA(:,5);
DemCandIdeal = DATA(:,6);
IncRep = DATA(:,7);
IncDem = DATA(:,8);
ExpChallRep = DATA(:,9);
ExpChallDem = DATA(:,10);
Year2008 = DATA(:,11);
Year2010 = DATA(:,12);
Year2012 = DATA(:,13);
Age = DATA(:,14);
State_FE=DATA(:,15:63);
State_Index = DATA(:,65); 

CandTypeDem = horzcat(IncDem, ExpChallDem);
CandTypeRep = horzcat(IncRep, ExpChallRep);
Dem = (DATA(:,68) == 1);
Rep = (DATA(:,68) == 2);

clear DATA;


Lambdas = vertcat(0.5, 0.5);
RHS = [Year2008, Year2010, Year2012, Dem, Rep];
Betas0 = vertcat(1, 1, zeros(length(RHS(1,:)), 1)); Theta_0 = vertcat(Lambdas, Betas0, 1);

[thetaTightProbit1G, fvalProbit1G] = fminunc(@(Theta) IndivVoterObjFun_Senate(Theta,VoteDem, VoterIdeal, CandTypeDem, CandTypeRep, DemCandIdeal, DemPartyIdeal, RepCandIdeal, RepPartyIdeal, RHS, UtilFuncParam, ChoiceProbForm), Theta_0, optionsTight);

[SEsBoot1 thetaBoot1 exitflagBoot1] = getVarCovBootstrapCluster_Senate(thetaTightProbit1G, VoteDem, VoterIdeal, CandTypeDem, CandTypeRep, DemCandIdeal, DemPartyIdeal, RepCandIdeal, RepPartyIdeal, RHS, UtilFuncParam, ChoiceProbForm, NumBootReps, optionsLoose, optionsTight, RandomizationSeed, State_Index);
[IncAdv_Mat_Probit1] = getIncAdv_Senate(thetaTightProbit1G,VoteDem, VoterIdeal, CandTypeDem, CandTypeRep, DemCandIdeal, DemPartyIdeal, RepCandIdeal, RepPartyIdeal, RHS, UtilFuncParam, 1,State_Index);

for b = 1:NumBootReps
    [IncAdv_Mat_Probit1_Boot(:,b)] = getIncAdv_Senate(thetaBoot1(:,b) ,VoteDem, VoterIdeal, CandTypeDem, CandTypeRep, DemCandIdeal, DemPartyIdeal, RepCandIdeal, RepPartyIdeal, RHS, UtilFuncParam, 1,State_Index);
end

IncAdv_Mat_Probit1_SE = sqrt((1/(NumBootReps-1)).*sum((IncAdv_Mat_Probit1_Boot - repmat(mean(IncAdv_Mat_Probit1_Boot,2), 1, NumBootReps)).^2,2));

csvwrite('thetaTightProbit1_EU_Partisan_Senate.csv', thetaTightProbit1G);
csvwrite('fvalProbit1_EU_Partisan_Senate.csv', fvalProbit1G);
csvwrite('IncAdv_Mat_Probit1_EU_Partisan_Senate.csv', IncAdv_Mat_Probit1);
csvwrite('thetaBoot_Probit1_EU_Partisan_Senate.csv', thetaBoot1);
csvwrite('IncAdv_Mat_Probit1_Boot_EU_Partisan_Senate.csv', IncAdv_Mat_Probit1_Boot);
csvwrite('IncAdv_Mat_Probit1_SE_EU_Partisan_Senate.csv', IncAdv_Mat_Probit1_SE);

%%
RHS = [Year2008, Year2010, Year2012, Dem, Rep, State_FE];
Betas0 = vertcat(1, 1, zeros(length(RHS(1,:)), 1)); Theta_0 = vertcat(Lambdas, Betas0, 1);
[thetaTightProbit2G, fvalProbit2G] = fminunc(@(Theta) IndivVoterObjFun_Senate(Theta,VoteDem, VoterIdeal, CandTypeDem, CandTypeRep, DemCandIdeal, DemPartyIdeal, RepCandIdeal, RepPartyIdeal, RHS, UtilFuncParam, ChoiceProbForm), Theta_0, optionsTight);

[SEsBoot2 thetaBoot2 exitflagBoot2] = getVarCovBootstrapCluster_Senate(thetaTightProbit2G, VoteDem, VoterIdeal, CandTypeDem, CandTypeRep, DemCandIdeal, DemPartyIdeal, RepCandIdeal, RepPartyIdeal, RHS, UtilFuncParam, ChoiceProbForm, NumBootReps, optionsLoose, optionsTight, RandomizationSeed, State_Index);

[IncAdv_Mat_Probit2] = getIncAdv_Senate(thetaTightProbit2G,VoteDem, VoterIdeal, CandTypeDem, CandTypeRep, DemCandIdeal, DemPartyIdeal, RepCandIdeal, RepPartyIdeal, RHS, UtilFuncParam, 1,State_Index);

for b = 1:NumBootReps
    [IncAdv_Mat_Probit2_Boot(:,b)] = getIncAdv_Senate(thetaBoot2(:,b) ,VoteDem, VoterIdeal, CandTypeDem, CandTypeRep, DemCandIdeal, DemPartyIdeal, RepCandIdeal, RepPartyIdeal, RHS, UtilFuncParam, 1,State_Index);
end

IncAdv_Mat_Probit2_SE = sqrt((1/(NumBootReps-1)).*sum((IncAdv_Mat_Probit2_Boot - repmat(mean(IncAdv_Mat_Probit2_Boot,2), 1, NumBootReps)).^2,2));

csvwrite('thetaTightProbit2_EU_Partisan_Senate.csv', thetaTightProbit2G);
csvwrite('fvalProbit2_EU_Partisan_Senate.csv', fvalProbit2G);
csvwrite('IncAdv_Mat_Probit2_EU_Partisan_Senate.csv', IncAdv_Mat_Probit2);
csvwrite('thetaBoot_Probit2_EU_Partisan_Senate.csv', thetaBoot2);
csvwrite('IncAdv_Mat_Probit2_Boot_EU_Partisan_Senate.csv', IncAdv_Mat_Probit2_Boot);
csvwrite('IncAdv_Mat_Probit2_SE_EU_Partisan_Senate.csv', IncAdv_Mat_Probit2_SE);




RandomizationSeed = 12345;


DATA = csvread('CCES_Matlab_IndivCovariates_Senate_Round.csv', 1, 0);


VoteDem = DATA(:,1);
VoterIdeal = DATA(:,2);
RepPartyIdeal = DATA(:,3);
DemPartyIdeal = DATA(:,4);
RepCandIdeal = DATA(:,5);
DemCandIdeal = DATA(:,6);
IncRep = DATA(:,7);
IncDem = DATA(:,8);
ExpChallRep = DATA(:,9);
ExpChallDem = DATA(:,10);
Year2008 = DATA(:,11);
Year2010 = DATA(:,12);
Year2012 = DATA(:,13);
Age = DATA(:,14);
State_FE=DATA(:,15:63);
State_Index = DATA(:,65); 

HighSchool = DATA(:,66);
TwoYearCollege = DATA(:,67);
FourYearCollege = DATA(:,68);
PostBA = DATA(:,69);
Female = DATA(:,70);
Af_Am = DATA(:,71);
Latino = DATA(:,72);
Asian = DATA(:,73);
AttendRelServiceWeek = DATA(:,74);
Income = DATA(:,75);
Dem = (DATA(:,78) == 1);
Rep = (DATA(:,78) == 2);


CandTypeDem = horzcat(IncDem, ExpChallDem);
CandTypeRep = horzcat(IncRep, ExpChallRep);



RHS = [Year2008, Year2010, Year2012, Dem, Rep, State_FE, HighSchool, TwoYearCollege, FourYearCollege, PostBA, Female, Af_Am, Latino, Asian, AttendRelServiceWeek, Income, Age];

Betas0 = vertcat(1, 1, zeros(length(RHS(1,:)), 1)); Theta_0 = vertcat(Lambdas, Betas0, 1);
[thetaTightProbit4G, fvalProbit4G] = fminunc(@(Theta) IndivVoterObjFun_Senate(Theta,VoteDem, VoterIdeal, CandTypeDem, CandTypeRep, DemCandIdeal, DemPartyIdeal, RepCandIdeal, RepPartyIdeal, RHS, UtilFuncParam, ChoiceProbForm), Theta_0, optionsTight);


[IncAdv_Mat_Probit4] = getIncAdv_Senate(thetaTightProbit4G,VoteDem, VoterIdeal, CandTypeDem, CandTypeRep, DemCandIdeal, DemPartyIdeal, RepCandIdeal, RepPartyIdeal, RHS, UtilFuncParam, 1,State_Index);


csvwrite('thetaTightProbit4_EU_Partisan_Senate.csv', thetaTightProbit4G);
csvwrite('fvalProbit4_EU_Partisan_Senate.csv', fvalProbit4G);
csvwrite('IncAdv_Mat_Probit4_EU_Partisan_Senate.csv', IncAdv_Mat_Probit4);

[SEsBoot4 thetaBoot4 exitflagBoot4] = getVarCovBootstrapCluster_Senate(thetaTightProbit4G, VoteDem, VoterIdeal, CandTypeDem, CandTypeRep, DemCandIdeal, DemPartyIdeal, RepCandIdeal, RepPartyIdeal, RHS, UtilFuncParam, ChoiceProbForm, NumBootReps, optionsLoose, optionsTight, RandomizationSeed, State_Index);




for b = 1:NumBootReps
    [IncAdv_Mat_Probit4_Boot(:,b)] = getIncAdv_Senate(thetaBoot4(:,b) ,VoteDem, VoterIdeal, CandTypeDem, CandTypeRep, DemCandIdeal, DemPartyIdeal, RepCandIdeal, RepPartyIdeal, RHS, UtilFuncParam, 1,State_Index);
end

IncAdv_Mat_Probit4_SE = sqrt((1/(NumBootReps-1)).*sum((IncAdv_Mat_Probit4_Boot - repmat(mean(IncAdv_Mat_Probit4_Boot,2), 1, NumBootReps)).^2,2));

csvwrite('thetaBoot_Probit4_EU_Partisan_Senate.csv', thetaBoot4);
csvwrite('IncAdv_Mat_Probit4_Boot_EU_Partisan_Senate.csv', IncAdv_Mat_Probit4_Boot);
csvwrite('IncAdv_Mat_Probit4_SE_EU_Partisan_Senate.csv', IncAdv_Mat_Probit4_SE);